<!DOCTYPE html>
<html>
<head>
	<title>作用域和预编译</title>
	<meta charset="utf-8">
</head>
<body>
作用域：
    全局作用域：最外层定义的变量
    局部作用域：只在固定的代码片段内可用，函数外出不可访问
    js没有块级作用域，局部作用域是由函数的产生而产生的，也叫函数作用域。

    注意：建议使用var声明变量，如果没有var声明，那么在函数内也是声明了全局变量。
    块级作用域：{}
<script>
	// function test(){
	// 	var a=10;
	// 	console.log(a);
	// }
	// test();
	// console.log(a);
</script>

js执行环境
    全局执行环境：最外面层的执行环境--->window
    因此所有的全局变量和函数都作用为window的属性和方法。GO

    局部执行环境：函数内的执行环境--->AO

js三部曲
    1.语法检查
    2.预编译
    3.逐行解释执行

预编译：
    <!-- 计算机执行到test()函数时，在执行的前一刻会创建一个ao对象。
    ao{ } 
    这是第一步，创建一个ao对象，第二步是将函数内所有的形参和变量声明储存到ao对象中，value为undefined；
    ao{a:undefined， b:undefined }
    第三步将形参和实参进行统一。
    ao{a:1,b:undefined}
    第四步将所有的函数声明的函数名作为ao对象中的key，函数整体内容作为value，存储到ao对象中
    ao{ a:function(){}, b:function(){} }
     -->
    

    1.创建AO对象（active object this，arguments）
    2.在函数内找用var定义的变量及形参变量，并且赋值为undefined
    3.形参和实参相统一
    4.找函数内用function定义的函数,并将函数体赋值。
<script>
	// 例题：
 	function test(a){
        console.log(a);//function
        console.log(aa)
        var aa=345;
        console.log(aa);//345
        var a=6;
        console.log(a);//6
        function a(){
            console.log(a);//6
            var cc=456;
            console.log(cc);//456
        }
        a();
    }
    test(4); 
 
    
</script>
作用域链：
    当一个函数被调用的时候，创建了执行环境和相应的作用域链，并且把作用域链赋值给一个特殊的内部属性[[scope]],然后用this，arguments(全局不存在),
    和其他的命名参数来初始化活动对象，当前的执行环境始终在作用域链的最顶端

    [[scope]]中所存储的执行期上下文的集合，这个集合呈链式结构，我们把这种链式叫做作用域链。也是作用域对象的集合。

<script>
	var a=10;
	function test(c,d){
	    var b=20;
	    function aa(){

	    }
	    aa();
	}
	test(4);
	
	
	go{
		a:10
		test:function
	}
</script>
</body>
</html>